package app.redis;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import app.htby.utils.RedisUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 本地 redis 连接池 工具类
 * 
 * @author lfy.xys
 * @date 2018年6月5日
 *
 */
public class JedisLocalPool {

	private static JedisPool pool = null;
	private static Logger logger = LoggerFactory.getLogger(JedisLocalPool.class);

	/**
	 * 建立连接池 真实环境，一般把配置参数缺抽取出来。
	 * 
	 */
	private static void createJedisPool() {
		// 建立连接池配置参数
		JedisPoolConfig config = new JedisPoolConfig();
		// 设置最大连接数 ，如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)
		config.setMaxTotal(10);
		// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例
		config.setMaxIdle(3);
		// 设置最大阻塞时间， 小于零:阻塞不确定的时间, 默认-1
		config.setMaxWaitMillis(1000);
		// 在borrow(引入)一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
		config.setTestOnBorrow(true);
		// return 一个jedis实例给pool时，是否检查连接可用性（ping()）
		config.setTestOnReturn(true);
		// 创建连接池
		pool = new JedisPool(config, RedisUtils.localIp, RedisUtils.localPort);
	}

	/**
	 * 在多线程环境同步初始化
	 */
	private static synchronized void poolInit() {
		if (pool == null)
			createJedisPool();
	}

	/**
	 * 获取一个jedis 对象
	 * 
	 * @return
	 */
	public static Jedis getJedis() {
		if (pool == null)
			poolInit();
		return pool.getResource();
	}

	/**
	 * 归还一个连接
	 * 
	 * @param jedis
	 */
	public static void returnRes(Jedis jedis) {
		if (jedis != null) {
			jedis.close();
		}
	}

	public static void main(String[] args) {
		boolean flag = false;// 连接成功 标志
		while (!flag) {
			try {
				// 等待时间
				// Thread.sleep(RedisUtils.reconnectTime);
				Thread.sleep(RedisUtils.reconnectTime);
				Jedis jedis = JedisLocalPool.getJedis();
				// 判断是否连接成功
				flag = jedis.isConnected();
				JedisLocalPool.returnRes(jedis);
				logger.info("连接上redis.");
			} catch (Exception e) {
				logger.error("没有连接上redis，正在重新连接...");
			}
		}
	}
}
